Add select_for_update for UserInfo/OrderInfo/GroupPhotoOrderInfo

Brightcells 8 years ago
parent
commit
7dd4575a8c
4 changed files with 18 additions and 11 deletions
  1. 3 1
      account/admin.py
  2. 11 6
      account/views.py
  3. 2 2
      group/lensman_views.py
  4. 2 2
      pay/views.py

+ 3 - 1
account/admin.py

@@ -3,6 +3,7 @@
3 3
 from curtail_uuid import CurtailUUID
4 4
 from django.contrib import admin
5 5
 from django.contrib.auth.hashers import make_password
6
+from django.db import transaction
6 7
 
7 8
 from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLoginLogInfo, UserIncomeExpensesInfo,
8 9
                             UserInfo, UserLoginLogInfo)
@@ -14,10 +15,11 @@ class LensmanInfoAdmin(admin.ModelAdmin):
14 15
     search_fields = ('name', 'phone', 'location')
15 16
     list_filter = ('sex', 'user_status', 'status')
16 17
 
18
+    @transaction.atomic
17 19
     def save_model(self, request, obj, form, change):
18 20
         if not obj.lensman_id:
19 21
             try:
20
-                user_id = UserInfo.objects.get(unionid=obj.unionid).user_id
22
+                user_id = UserInfo.objects.select_for_update().get(unionid=obj.unionid).user_id
21 23
             except UserInfo.DoesNotExist:
22 24
                 user_id = None
23 25
             obj.lensman_id = user_id or CurtailUUID.uuid(UserInfo, 'user_id')

+ 11 - 6
account/views.py

@@ -3,6 +3,7 @@
3 3
 from curtail_uuid import CurtailUUID
4 4
 from django.contrib.auth.hashers import check_password, make_password
5 5
 from django.contrib.auth.models import Group, User
6
+from django.db import transaction
6 7
 from logit import logit
7 8
 from rest_framework import viewsets
8 9
 from TimeConvert import TimeConvert as tc
@@ -44,6 +45,7 @@ def user_is_registered_api(request):
44 45
 
45 46
 
46 47
 @logit
48
+@transaction.atomic
47 49
 def user_signup_api(request):
48 50
     user_id = request.POST.get('user_id', '')
49 51
     username = request.POST.get('username', '')
@@ -56,7 +58,7 @@ def user_signup_api(request):
56 58
     signup_ip, signup_at = ip_addr(request), tc.utc_datetime()
57 59
 
58 60
     try:
59
-        user = UserInfo.objects.get(user_id=user_id)
61
+        user = UserInfo.objects.select_for_update().get(user_id=user_id)
60 62
     except UserInfo.DoesNotExist:
61 63
         user = None
62 64
 
@@ -83,12 +85,13 @@ def user_signup_api(request):
83 85
 
84 86
 
85 87
 @logit
88
+@transaction.atomic
86 89
 def user_login_api(request):
87 90
     username = request.POST.get('username', '')
88 91
     password = request.POST.get('password', '')
89 92
 
90 93
     try:
91
-        user = UserInfo.objects.get(username=username)
94
+        user = UserInfo.objects.select_for_update().get(username=username)
92 95
     except UserInfo.DoesNotExist:
93 96
         return response(UserStatusCode.USER_NOT_FOUND)
94 97
 
@@ -116,6 +119,7 @@ def user_login_api(request):
116 119
 
117 120
 
118 121
 @logit
122
+@transaction.atomic
119 123
 def user_wx_authorize_api(request):
120 124
     user_id = request.POST.get('user_id', '')
121 125
 
@@ -131,7 +135,7 @@ def user_wx_authorize_api(request):
131 135
 
132 136
     # 判断 unionid 是否已经存在,如果已经存在,则直接返回改帐户信息
133 137
     try:
134
-        user = UserInfo.objects.get(unionid=unionid)
138
+        user = UserInfo.objects.select_for_update().get(unionid=unionid)
135 139
     except UserInfo.DoesNotExist:
136 140
         user = None
137 141
 
@@ -153,7 +157,7 @@ def user_wx_authorize_api(request):
153 157
     signup_ip, signup_at = ip_addr(request), tc.utc_datetime()
154 158
 
155 159
     try:
156
-        user = UserInfo.objects.get(user_id=user_id)
160
+        user = UserInfo.objects.select_for_update().get(user_id=user_id)
157 161
     except UserInfo.DoesNotExist:
158 162
         user = None
159 163
 
@@ -216,6 +220,7 @@ def guest_status_api(request):
216 220
 
217 221
 
218 222
 @logit
223
+@transaction.atomic
219 224
 def guest_login_api(request):
220 225
     """ 游客登录 """
221 226
     gen = get_guest_entrance_control()
@@ -249,12 +254,12 @@ def guest_login_api(request):
249 254
     }
250 255
     # 若 uuid 存在,则 get_or_create,否则 create
251 256
     if uuid:
252
-        user, created = UserInfo.objects.get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields)
257
+        user, created = UserInfo.objects.select_for_update().get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields)
253 258
         if created:
254 259
             user.nickname = u'游客{}'.format(user.pk)
255 260
             user.save()
256 261
     else:
257
-        user = UserInfo.objects.create(**fields)
262
+        user = UserInfo.objects.select_for_update().create(**fields)
258 263
         user.nickname = u'游客{}'.format(user.pk)
259 264
         user.save()
260 265
 

+ 2 - 2
group/lensman_views.py

@@ -300,7 +300,7 @@ def lensman_origin_photo_upload_api(request):
300 300
     photo = request.FILES.get('photo', '')
301 301
 
302 302
     try:
303
-        order = OrderInfo.objects.get(order_id=order_id, pay_status=OrderInfo.PAID)
303
+        order = OrderInfo.objects.select_for_update().get(order_id=order_id, pay_status=OrderInfo.PAID)
304 304
     except OrderInfo.DoesNotExist:
305 305
         return response(OrderStatusCode.WX_ORDER_NOT_FOUND)
306 306
 
@@ -375,7 +375,7 @@ def lensman_origin_photo_upload_api(request):
375 375
             r_photo_path=r_photo_path
376 376
         )
377 377
 
378
-        porder, created = GroupPhotoOrderInfo.objects.get_or_create(
378
+        porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create(
379 379
             group_id=order.group_id,
380 380
             session_id=session_id,
381 381
             user_id=order.from_uid,

+ 2 - 2
pay/views.py

@@ -116,7 +116,7 @@ def order_paid_success(order):
116 116
     order.paid_at = tc.utc_datetime()
117 117
     order.save()
118 118
 
119
-    porder, created = GroupPhotoOrderInfo.objects.get_or_create(
119
+    porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create(
120 120
         group_id=order.group_id,
121 121
         session_id=order.session_id,
122 122
         user_id=order.from_uid,
@@ -185,7 +185,7 @@ def wx_order_query_api(request):
185 185
     transaction_id = request.POST.get('transaction_id', '')
186 186
 
187 187
     try:
188
-        order = OrderInfo.objects.get(order_id=order_id)
188
+        order = OrderInfo.objects.select_for_update().get(order_id=order_id)
189 189
     except OrderInfo.DoesNotExist:
190 190
         return response(OrderStatusCode.WX_ORDER_NOT_FOUND)
191 191